package org.gvp.common.constant;

import java.util.List;

/**
 * <li>数据库操作dao数据层通用接口,该接口作为对数据层操作的统一约束</li>
 * <li>该接口只执行原子性操作,也可以实现对于缓存的操作,或者使用缓存管理器在此接口实现类</li>
 * <ul>
 *     <li>增加数据方法前缀: append </li>
 *     <li>删除数据方法前缀: cancel </li>
 *     <li>修改数据方法前缀: modify </li>
 *     <li>查找数据方法前缀: search </li>
 *     <li>请求列表数据方法前缀: searchList </li>
 * </ul>
 * @param <T> 数据库实体类数据类型
 * @author gvp
 * @since 2024-02-25 20:09
 * @version 1.2
 */
public interface BaseRepository<T> {
    /**
     * 添加一条数据信息
     */
    default int append(T pojo){
        return 0;
    }
    /**
     * 修改数据,默认修改所有字段,不会修改数据id,根据id进行修改
     */
    default int modify(T pojo){
        return 0;
    }
    /**
     * 根据id删除数据
     */
    default int cancel(Integer id){
        return 0;
    }
    /**
     * 根据id查找数据
     */
    default T searchById(Integer id){
        return null;
    }
    /**
     * 查找所有数据列表,不包含逻辑删除的数据
     */
    default List<T> searchList(){
        return null;
    }
    /**
     * 查找指定条数的数据列表,默认查找 * ,查找不包含逻辑删除的数据
     * @param field 指定要查找的数据量的字段,默认为 *
     * @return 返回查找到数据的行数
     */
    default Long searchCount(String field){
        return null;
    }
    /**
     * 查找指定条数的数据列表
     * @param start 查找开始位置
     * @param end 查找结束位置
     * @return 返回查找到的数据列表,如果没有查找到数据,则返回null
     */
    default List<T> searchLimit(int start, int end){
        return null;
    }
    /**
     * 查找指定条数的数据列表,根据指定日期范围
     * @param start 开始位置
     * @param end 结束位置
     * @param dateStart 查找开始日期
     * @param dateEnd 查找结束日期
     * @return 返回查找到的数据列表,如果没有查找到数据,则返回null
     */
    default List<T> searchLimit(int start, int end, String dateStart ,String dateEnd){
        return null;
    }
    /**
     * 逻辑删除指定id的数据
     */
    default int logicalCancel(Integer id){
        return 0;
    }
    /**
     * 根据id恢复逻辑删除的数据
     */
    default int recoverCancel(Integer id){
        return 0;
    }

    /**
     * 查找指定条数的数据列表,根据日期范围查找数据
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 此区别的数据个数
     */
    default Long searchCountRange(String startDate, String endDate){
        return null;
    }
}
